var cheerio = require('cheerio');
var root = require('../app.js');
var app = require('express')();
var concat = require('concat-stream');
var request = require('request');
var _ = require('lodash');
var log = console.log.bind(console);
var lerror = console.error.bind(console);
var domain = require('domain');

root.use('/rcn',app);
const timeout = 5000;
/**
 * 以下定义了一些个人喜好的资源rest
 */
//国学诗词
app.get('/poem',function(req,res,next){
    randomShi((s=>{
        res.json({
            poem:s
        });
    }))
});
//艺名
app.get('/name',function(req,res,next){
    randomName((n)=>{
        res.json({name:n});
    })
});

//MM图片
app.get('/mm',function(req,res,next){
    randomMMID(0,id=>{
        console.log('mmid:',id);
        res.json({id:id});
    })
});

app.get('/mm/:jpg',function (req,res,next) {
    //var url = 'http://www.wallpaperup.com/wallpapers/download/'+req.params.id + '.jpg';
    var root = req.query.thumb ? 'https://alpha.wallhaven.cc/wallpapers/' : 'https://wallpapers.wallhaven.cc/wallpapers/';
    var pref = req.query.thumb ? 'thumb/small/th-' : 'full/wallhaven-';
    var url = root + pref + req.params.jpg;
    console.log(new Date(),url);
    // req.setTimeout(timeout,()=>{
    //     console.log('持续连接50秒超时');
    // });
    request({url:url,timeout:timeout})
    //非常重要的一点,error必须写在pipe之前
    .on('error',(err)=>{

        console.error('mmjpg:',err)
        console.error(new Date(),url);
        next(err);
    })
    .pipe(res);
    
});
//处理未知错误
app.use((req,res,next)=>{
    var err = new Error('Unknow response error');
    err.status = 404;
    next(err);
});
//处理已知错误
app.use((err,req,res,next)=>{
    res.status(err.status || 500);

    res.end(JSON.stringify({
        message: err.message,
        error: err
    }));
});

function randomMMID(en,cb){
    var id = _.random(450000);
    var url = 'https://wallpapers.wallhaven.cc/wallpapers/full/wallhaven-' + id+'.jpg';
    try{
        request(url)
        //非常重要的一点,error必须写在pipe之前
        .on('error',(err)=>{
            console.error('mm id:',err,url);
            randomMMID(++en,cb);
        })
        .on('response',(res)=>{
            if(res.statusCode == 200)
                cb(id);
            else if(en > 3)
                    cb(-1);
            else
                randomMMID(++en,cb);
        });
    }catch(err){
        if(en > 10)
            cb(-1);
        else
            randomMMID(++en,cb);
    };
}

function randomName(cb){
    request({url:'http://www.qmsjmfb.com/',timeout:timeout},function(err,res,body){
        if(err) cb('无名氏');
        else if(res.statusCode != 200) cb('无名氏');
        else{
            var $ = cheerio.load(body);
            var li = $('li');
            cb(li[Math.round(Math.random()*(li.length - 1))].children[0].data);
        }
    });
}

var rootUrl = 'http://sc.zdic.net';

function getDT_A_HREF(url,cb){
    request({url:url,timeout:timeout},function(err,res,body){
        if(err) cb(err);
        else if(res.statusCode != 200) cb({info:"can't find url"});
        else{
            var $ = cheerio.load(body);
            var dt = $('dt');
            var hrefs = [];
            dt.each((i,ele)=>{
                hrefs.push($('a',ele).attr('href'));
            });
            var oneUrl = rootUrl + hrefs[Math.round(Math.random()*(hrefs.length-1))];
            cb(null,oneUrl);
        }
    });
}
function getSCNR(shiUrl,cb){
    request({url:shiUrl,timeout:timeout},function(err,res,body){
        if(err) cb(err)
        else if(res.statusCode != 200) cb({info:'no see shi'});
        else{
            var scnr = cheerio.load(body)('#scnr')[0];
            var ju = [];
            scnr.children.forEach((ele,i)=>{
                ele.type == 'text' &&  ju.push(ele.data);
            });
            var seg = [];
            ju.join('').split(/，| |。|？|！|【|】|“|”|；|\r|\t|\n/).forEach((s,i)=>{
                s && seg.push(s);
            })
            cb(null,seg);
        }
    });
}

function randomShi(cb){
    getDT_A_HREF(rootUrl,(err,renUrl)=>{
        if(err) randomShi(cb);
        else
            getDT_A_HREF(renUrl,(er,shiUrl)=>{
                if(er) randomShi(cb);
                else{
                    console.log('shi:',shiUrl);
                    getSCNR(shiUrl,(e,seg)=>{
                        if(e) randomShi(cb)
                        else
                            cb(seg[Math.round(Math.random()* (seg.length-1))])
                    });
                }
            })
    })
}

